#ifndef __System_H_
#define __System_H_


#include "stdint.h"
#include "stdbool.h"

#include "Hardware_stm32f10x.h"
#define nop __asm("nop")

#define MAX_BIT (31)
#define MAX_APBNUM (2)


//中断等级
#define SYS_INT_HIGHEST_PRO			1			//系统预留最高优先级中断
#define SYS_INT_DELAY_TIME_PRO		0		//阻塞延时中断优先级-使用FIQ中断
#define SYS_INT_OS_TICK_PRO			3			//系统滴答时钟中断优先级
#define SYS_INT_UART_RX_PRO			4			//UART串口中断优先级
#define SYS_INT_RTC_PRO				5				//RTC中断优先级
#define SYS_INT_TIMA4_PRO			7				//TIMA4 溢出中断优先级
#define SYS_INT_TIMA3_PRO			8				//TIMA3 溢出中断优先级
#define SYS_INT_TIMA5_PRO			10			//StopWatch使用的TIMA5定时器溢出中断优先级
#define SYSTICK_PRIORITY			15			//滴答定时器优先级

//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
 
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入





/* 单片机进入中断 */
void cpu_enter_critical(void);

/* 单片机退出中断*/
void cpu_exit_critical(void);

/* 单片机复位*/
void SYS_RESET(void);

/* 系统外部时钟使能*/
void SYS_PeripheralClockEnable(SYS_DEV_CLOCKTypeDef DevClock,bool Enable);

/* GPIO 初始化*/
void SYS_GPIOx_PinInit(GPIO_TypeDef *GPIOx,u8 PinNum,SYS_GPIO_MODE Mode,SYS_GPIO_DRV GPIO_DRV_Gain,GPIO_PinStatus Status);


#endif



